package jef.database;

import java.sql.SQLException;


/**
 * 持有一个查询结果，以及对应的resultset中的记录
 * @author Administrator
 *
 * @param <T>
 */
public class RecordHolder<T extends IQueryableEntity> {
	private T object;
	private RecordsHolder<T> parent;
	int status = 0;//1表示是删除的，-1表示是已经删除的
	int index;//0表示rs的第一条记录。
	
	public static final int INSERT = -1;
	public static final int INSERTED = -2;
	public static final int DELETE = -3;
	public static final int DELETED = -4;
	public static final int CACNLED = -5;
	
	int getStatus() {
		return status;
	}
	boolean isInsert(){
		return status==INSERT;
	}
	boolean isInserted(){
		return status==INSERTED;
	}
	boolean isBeingDelete(){
		return status==DELETE;
	}
	boolean isDeleted(){
		return status==DELETED;
	}
	void setDeleted(){
		if(this.status==DELETE){
			this.status=DELETED;
		}else{
			throw new IllegalArgumentException("the record is not about to delete.");
		}
	}
	
	void setInserted(){
		if(this.status==INSERT){
			this.status=INSERTED;
		}else{
			throw new IllegalArgumentException("the record is not about to insert.");
		}
	}
	
	RecordHolder(RecordsHolder<T> parent,int index,T object){
		this.parent=parent;
		this.index=index;
		if(index<0)status=INSERT;
		this.object=object;
	}
	
	/**
	 * 获得记录对应的Entity Bean 
	 * @return
	 */
	public T get(){
		if(status==DELETED)return null;
		return object;
	}
	
	/**
	 * 更新此条记录。并提交到数据库。最后释放游标
	 * @throws SQLException
	 */
	public void commit() throws SQLException{
		parent.commit();
	}
	
	/**
	 * 删除此条记录，并提交到数据库
	 * @throws SQLException
	 */
	public void delete() throws SQLException{
		if(status==INSERT){
			this.status=CACNLED;
		}else if(status==INSERTED){
			throw new UnsupportedOperationException("Can not delete a record inseted right now.");
		}else if(status==DELETED){
			throw new UnsupportedOperationException("Can not delete a record deleted right now.");
		}else{
			this.status=DELETE;	
		}
		parent.commit();
	}
	/**
	 * 关闭当前ResultSet，如果有未提交的修改直接丢弃
	 * @throws SQLException
	 */
	public void close() throws SQLException{
		parent.close();
	}
	@Override
	public String toString() {
		StringBuilder sb=new StringBuilder();
		sb.append("index:").append(index).append('\t');
		sb.append(status);
		return sb.toString();
	}
	
}
